import Cookie from 'js-cookie'
// 401拦截
const resp401 = {
  /**
   * 响应数据之前做点什么
   * @param response 响应对象
   * @param options 应用配置 包含: {router, i18n, store, message}
   * @returns {*}
   */
  onFulfilled(response, options) {
    const { message } = options
    if (response.status === 401) {
      message.error('无此权限')
    }

    return response;
  },
  /**
   * 响应出错时执行
   * @param error 错误对象
   * @param options 应用配置 包含: {router, i18n, store, message}
   * @returns {Promise<never>}
   */
  onRejected(error, options) {
    const { message } = options
    const { response } = error
    if (response.status === 401) {
      message.error('无此权限')
    }
    return Promise.reject(error)
  }
}

const resp403 = {
  onFulfilled(response, options) {
    const { message } = options
    if (response.status === 403) {
      message.error('请求被拒绝')
    }
    return response
  },
  onRejected(error, options) {
    const { message } = options
    const { response } = error
    if (response.status === 403) {
      message.error('请求被拒绝')
    }
    return Promise.reject(error)
  }
}

const reqCommon = {
  /**
   * 发送请求之前做些什么
   * @param config axios config
   * @param options 应用配置 包含: {router, i18n, store, message}
   * @returns {*}
   */
  onFulfilled(config, options) {
    const { message } = options
    const { url, xsrfCookieName } = config
    if (url.indexOf('login') === -1 && xsrfCookieName && !Cookie.get(xsrfCookieName)) {
      message.warning('认证 token 已过期，请重新登录')
    }
    return config;
  },
  /**
   * 请求出错时做点什么
   * @param error 错误对象
   * @param options 应用配置 包含: {router, i18n, store, message}
   * @returns {Promise<never>}
   */
  onRejected(error, options) {
    
    const { message } = options
    if (message) {
      message.error(error.message)
    } else {
      let response = error.response
      let result = response.data ? response.data.result : null;
      if (result == null) {
        if (response.data && response.data.error) {
          message.error("错误号:" + response.data.error.code + "\r\n" + response.data.error.error);
        } else {
          message.error("http接口调用失败");
        }
        console.log("------http error:", response, options);
      }
    }

    return Promise.reject(error)
  }
}

function showMsg(response, message) {

  let result = response.data ? response.data.result : null;
  if (result == null) {
    if (response.data && response.data.error) {
      message.error("错误号:" + response.data.error.code + "\r\n" + response.data.error.message);
    } else {
      message.error("http接口调用失败");
    }

  }
}

const resp200 = {
  /**
   * 发送请求之前做些什么
   * @param config axios config
   * @param options 应用配置 包含: {router, i18n, store, message}
   * @returns {*}
   */
  onFulfilled(response, options) {
    if(response.status != 200){
      return response
    }
    //const {message} = options
    if (response.data && response.data.result) {
      return response.data.result;
    }
    const { message } = options
    showMsg(response, message)
    console.log("------http error:", response, options);
    return Promise.reject({
      response,
      message: (response && response.data && response.data.error) ? response.data.error.message : "失败",
    }, options);


  },
  /**
   * 请求出错时做点什么
   * @param error 错误对象
   * @param options 应用配置 包含: {router, i18n, store, message}
   * @returns {Promise<never>}
   */
  onRejected(error, options) {
    console.log("------http error:", error, options);
   
    const { message } = options
    if (message) {
      if (error.message) {
        message.error(error.message)
      } else {
        let response = error.response
        showMsg(response)
      }

    }

    return Promise.reject(error)
  }
}

export default {
  request: [reqCommon], // 请求拦截
  response: [resp401, resp403, resp200] // 响应拦截
}
